import { Provide, Config, Inject } from '@midwayjs/core';
import { COSService } from '@midwayjs/cos';
import dayjs = require('dayjs');

@Provide()
export class FileService {
    @Config('cos')
    cosConfig;

    @Inject()
    cosService: COSService;

    /**
     * 上传文件到腾讯云COS
     * @param file 文件对象
     */
    async uploadFile(file: any): Promise<string> {
        try {

            const extension = file.filename.includes('.') ? file.filename.split('.').pop() : '';
            const randomNum = Math.floor(Math.random() * 9000) + 1000;
            const path = `uploads/${dayjs().format('YYYY-MM-DD')}/${Date.now()}_${randomNum}${extension ? `.${extension}` : ''}`
            // 上传文件到COS
            await this.cosService.putObject({
                Bucket: 'fday-1308080822',
                Region: 'ap-shanghai', // 默认使用广州区域
                Key: path,
                // 根据文件对象的不同属性选择合适的数据源
                Body: file.data,
            });
            
            return path;
        } catch (error) {
            console.error('文件上传错误详情:', error);
            throw new Error(`文件上传失败: ${error.message}`);
        }
    }

    /**
     * 获取文件数据流
     * @param key 文件在COS中的Key
     * @returns 返回文件的Buffer数据
     */
    async getFileUrl(key: string): Promise<Buffer> {
        try {
            // 检查参数
            if (!key) {
                throw new Error('文件key不能为空');
            }

            // 检查COS配置是否有效
            if (!this.cosConfig || !this.cosConfig.client || !this.cosConfig.client.Bucket) {
                throw new Error('COS配置无效，请检查配置文件');
            }

            const result = await this.cosService.getObject({
                Bucket: this.cosConfig.client.Bucket,
                Region: this.cosConfig.client.Region || 'ap-shanghai',
                Key: `uploads/${key}`,
            });
            
            if (!result || !result.Body) {
                throw new Error('获取文件数据失败');
            }
            
            return result.Body as Buffer;
        } catch (error) {
            console.error('获取文件数据错误详情:', error);
            throw new Error(`获取文件数据失败: ${error.message}`);
        }
    }

    /**
     * 删除COS上的文件
     * @param key 文件在COS中的Key
     */
    async deleteFile(key: string): Promise<boolean> {
        try {
            // 检查参数
            if (!key) {
                throw new Error('文件key不能为空');
            }

            // 检查COS配置是否有效
            if (!this.cosConfig || !this.cosConfig.client || !this.cosConfig.client.Bucket) {
                throw new Error('COS配置无效，请检查配置文件');
            }

            await this.cosService.deleteObject({
                Bucket: this.cosConfig.client.Bucket,
                Region: this.cosConfig.client.Region || 'ap-shanghai',
                Key: key,
            });
            
            return true;
        } catch (error) {
            console.error('删除文件错误详情:', error);
            throw new Error(`删除文件失败: ${error.message}`);
        }
    }
}